package org.algorithm.biubiu.wheel_1.DFS算法;

/**
 给你一个大小为 m x n 的二进制矩阵 grid ，其中 0 表示一个海洋单元格、1 表示一个陆地单元格。

 一次 移动 是指从一个陆地单元格走到另一个相邻（上、下、左、右）的陆地单元格或跨过 grid 的边界。

 返回网格中 无法 在任意次数的移动中离开网格边界的陆地单元格的数量。

 来源：力扣（LeetCode）
 链接：https://leetcode-cn.com/problems/number-of-enclaves
 */
public class $5月5日$飞地的数量 {


    public int numEnclaves(int[][] grid) {
        int res = 0;
        int row = grid.length;
        int col = grid[0].length;
        //上下边界
        for(int i=0;i<row;i++){
            dfs(grid,i,0);
            dfs(grid,i,col-1);
        }
        for(int i = 0; i<col;i++){
            dfs(grid,0,i);
            dfs(grid,row-1,i);
        }
        for(int i=0;i<row;i++){
            for(int j=0;j<col;j++){
                if(grid[i][j]==1){
                    res++;
                }
            }
        }
        return res;
    }

    public void dfs(int[][]grid,int i,int j){
        int row = grid.length;
        int col = grid[0].length;
        if(i<0||j<0 || i>=row||j>=col){
            return;
        }
        if(grid[i][j]==0){
            return;
        }
        grid[i][j]=0;
        dfs(grid,i,j+1);
        dfs(grid,i,j-1);
        dfs(grid,i+1,j);
        dfs(grid,i-1,j);
    }
}
